/*******************************************************************************
 * Classe Jeu : Classe de gestion du déroulement du jeu
 ******************************************************************************/
package prjintwg;

import Armes.SousBombe;

/**
 *
 * @author W&G
 */
public class Jeu {

    private Fenetre f;//Fenetre du programme
    private static PnlJeu pnlJeu;// panneau contenant le jeu
    private static double vent = 0;//vent général sur le terrain
    private static double gravite = 9.8;//gravité générale sur le terrain
    private static int tourTir = 1;//tour des joueurs
    public static double[] tabGravite = new double[1072];//tableau des différentes valeurs de la gravité par pixel
    public static double[] tabVent = new double[1072];//tableau des différentes valeurs du vent par pixel
    int quProjSimple1 = 0;//quantité du projectile simple du joueur 1
    int quNJump1 = 0;//quantité du NJumper du joueur 1
    int quBSon1 = 0;//quantité de la bombe sonore du joueur 1
    int quBFert1 = 0;//quantité de la bombe fertile du joueur 1
    int quBoom1 = 0;//quantité du boomrang du joueur 1
    int quBTorn1 = 0;//quantité de la bombe tornadedu joueur 1
    int quBGrav1 = 0;//quantité de la bombe gravité du joueur 1
    int quLaser1 = 0;//quantité du laser du joueur 1
    int quProjSimple2 = 0;//quantité du projectile simple du joueur 2
    int quNJump2 = 0;//quantité du NJumper du joueur 2
    int quBSon2 = 0;//quantité de la bombe sonore du joueur 2
    int quBFert2 = 0;//quantité de la bombe fertile du joueur 2
    int quBoom2 = 0;//quantité du boomerang du joueur 2
    int quBTorn2 = 0;//quantité de la bombe tornade du joueur 2
    int quBGrav2 = 0;//quantité de la bombe gravité du joueur 2
    int quLaser2 = 0;//quantité du laser du joueur 2
/**
 * Constructeur de Jeu
 * @param f fenetre contenant le jeu
 * @param pnljeu panneau ou se déroule le jeu
 */
    public Jeu(Fenetre f, PnlJeu pnljeu) {
        this.f = f;
        pnlJeu = pnljeu;
        setTabGravite(0, 1072, gravite);
        setTabVent(0, 1072, vent);
        setQuantites(500, 5, 3, 3, 5, 1, 1, 6, 500, 5, 3, 3, 5, 1, 1, 6);
    }
/**
 * Methode de déplacement du projectile
 * @param vitesse vitesse du projectile
 * @param angle angle du projectile
 */
    public void deplacement(double vitesse, int angle) {
        pnlJeu.getProjectile().setPosition(pnlJeu.getProjectile().getPositionX(),
                pnlJeu.getProjectile().getPositionY());


        pnlJeu.getProjectile().setVitesseX(vitesse, angle);
        pnlJeu.getProjectile().setVitesseY(vitesse, angle);

        pnlJeu.getProjectile().deplacement();
    }
/**
 * Méthode définissant les quantités des armes pour les deux joueurs
 * @param projSimple1 quantité du projectile simple du joueur 1
 * @param nJump1 quantité du NJumper du joueur 1
 * @param bSon1 quantité de la bombe sonore du joueur 1
 * @param bFert1 quantité de la bombe fertile du joueur 1
 * @param boom1 quantité du boomrang du joueur 1
 * @param bTorn1 quantité de la bombe tornade du joueur 1
 * @param bGrav1 quantité de la bombe gravité du joueur 1
 * @param laser1 quantité du laser du joueur 1
 * @param projSimple2 quantité du projectile simple du joueur 2
 * @param nJump2 quantité du NJumper du joueur 2
 * @param bSon2 quantité de la bombe sonore du joueur 2
 * @param bFert2 quantité de la bombe fertile du joueur 2
 * @param boom2 quantité du boomrang du joueur 2
 * @param bTorn2 quantité de la bombe tornade du joueur 2
 * @param bGrav2 quantité de la bombe gravité du joueur 2
 * @param laser2 quantité du laser du joueur 2
 */
    public void setQuantites(int projSimple1, int nJump1, int bSon1, int bFert1,
            int boom1, int bTorn1, int bGrav1, int laser1, int projSimple2,
            int nJump2, int bSon2, int bFert2, int boom2, int bTorn2,
            int bGrav2, int laser2) {
        quProjSimple1 = projSimple1;
        quNJump1 = nJump1;
        quBSon1 = bSon1;
        quBFert1 = bFert1;
        quBoom1 = boom1;
        quBTorn1 = bTorn1;
        quBGrav1 = bGrav1;
        quLaser1 = laser1;

        quProjSimple2 = projSimple2;
        quNJump2 = nJump2;
        quBSon2 = bSon2;
        quBFert2 = bFert2;
        quBoom2 = boom2;
        quBTorn2 = bTorn2;
        quBGrav2 = bGrav2;
        quLaser2 = laser2;
    }
/**
 * Retourne la quantité de l'arme voulue
 * @param arme numéro de l'arme
 * @param joueur numéro du joueur
 * @return quantité de l'arme
 */
    public int getQuantite(int arme, int joueur) {
        int retour = 0;

        if (joueur == 1) {
            switch (arme) {
                case 1:
                    retour = quProjSimple1;
                    break;
                case 2:
                    retour = quNJump1;
                    break;
                case 3:
                    retour = quBSon1;
                    break;
                case 4:
                    retour = quBFert1;
                    break;
                case 5:
                    retour = quBoom1;
                    break;
                case 6:
                    retour = quBTorn1;
                    break;
                case 7:
                    retour = quBGrav1;
                    break;
                case 8:
                    retour = quLaser1;
                    break;
            }
        } else {
            switch (arme) {
                case 1:
                    retour = quProjSimple2;
                    break;
                case 2:
                    retour = quNJump2;
                    break;
                case 3:
                    retour = quBSon2;
                    break;
                case 4:
                    retour = quBFert2;
                    break;
                case 5:
                    retour = quBoom2;
                    break;
                case 6:
                    retour = quBTorn2;
                    break;
                case 7:
                    retour = quBGrav2;
                    break;
                case 8:
                    retour = quLaser2;
                    break;
            }
        }
        return retour;
    }
/**
 * Définit la quantité de l'arme voulue
 * @param arme numéro de l'arme
 * @param joueur numéro du joueur
 * @param valeur valeur a assigner a l'arme
 */
    public void setQuantite(int arme, int joueur, int valeur) {
        if (joueur == 1) {
            switch (arme) {
                case 1:
                    quProjSimple1 = valeur;
                    break;
                case 2:
                    quNJump1 = valeur;
                    break;
                case 3:
                    quBSon1 = valeur;
                    break;
                case 4:
                    quBFert1 = valeur;
                    break;
                case 5:
                    quBoom1 = valeur;
                    break;
                case 6:
                    quBTorn1 = valeur;
                    break;
                case 7:
                    quBGrav1 = valeur;
                    break;
                case 8:
                    quLaser1 = valeur;
                    break;
            }
        } else {
            switch (arme) {
                case 1:
                    quProjSimple2 = valeur;
                    break;
                case 2:
                    quNJump2 = valeur;
                    break;
                case 3:
                    quBSon2 = valeur;
                    break;
                case 4:
                    quBFert2 = valeur;
                    break;
                case 5:
                    quBoom2 = valeur;
                    break;
                case 6:
                    quBTorn2 = valeur;
                    break;
                case 7:
                    quBGrav2 = valeur;
                    break;
                case 8:
                    quLaser2 = valeur;
                    break;
            }
        }
    }
/**
 * Definit la gravité dans une region
 * @param debut début de la region
 * @param fin fin de la region
 * @param gravite valeur de la gravité a assigner
 */
    public static void setTabGravite(int debut, int fin, double gravite) {
        for (int i = 0; i < 1072; i++) {
            if (i >= debut && i <= fin) {
                tabGravite[i] = gravite;
            }
        }
    }
/**
 * Retourne la gravité pour un endroit
 * @param position position désirée
 * @return la gravité pour un endroit donné
 */
    public static double getTabGravite(int position) {
        if (position >= 0 && position < 1072) {
            return tabGravite[position];
        } else {
            return gravite;
        }

    }
/**
 * Définit le vent pour une région
 * @param debut début de la region a modifier
 * @param fin fin de la region a modifier
 * @param vent valeur du vent a assigner
 */
    public static void setTabVent(int debut, int fin, double vent) {
        for (int i = 0; i < 1072; i++) {
            if (i >= debut && i <= fin) {
                tabVent[i] = vent;
            }
        }
    }
/**
 * Retourne le vent pour une position
 * @param position position désirée
 * @return retourne la valeur du vent pour une position donée
 */
    public static double getTabVent(int position) {
        if (position >= 0 && position < 1072) {
            return tabVent[position];
        } else {
            return vent;
        }
    }
/**
 * Définir la gravité générale
 * @param gr gravité a assigner
 */
    public static void setGravite(double gr) {
        gravite = gr;
        setTabGravite(0,1072,gr);
        pnlJeu.setLblGravite(gr);
    }
/**
 * Définit le vent général
 * @param vent vent a assigner
 */
    public static void setVent(double vent) {
        Jeu.vent = vent;
        setTabVent(0,1072, vent);
        pnlJeu.setLblVent(vent);
    }
/**
 * Retourne la gravité générale
 * @return retourne la gravité générale
 */
    public static double getGravite() {
        return gravite;
    }
/**
 * Retourne le vent générale
 * @return retourne le vent générale
 */
    public static double getVent() {
        return vent;
    }
/**
 * Retourne le tour de tir
 * @return retourne le tour de tir
 */
    public static int getTourTir() {
        return tourTir;
    }
/**
 * Change le tour de tir
 */
    public static void ajouterTour() {
        tourTir++;
    }
/**
 * Méthode de définition de l'explosion des projectiles
 * @param rayon rayond de l'explosion
 * @param projectile projectile qui explose s'il y a lieu
 * @param sb sous bombe qui explose s'il y a lieu
 */
    public void explosion(int rayon, ProjectileSimple projectile, SousBombe sb) {
        int posX = 0;
        int posY = 0;
        if (projectile != null) {
            posX = projectile.getPositionX() / 2;
            posY = projectile.getPositionY();
        } else if (sb != null) {
            posX = sb.getPositionX() / 2;
            posY = sb.getPositionY();
        }
        double rayonYDbl = 0;
        for (int i = 0; i < rayon; i++) {
            double iDbl = (double) i;
            double rayonDbl = (double) rayon;
            rayonYDbl = rayon * Math.cos(Math.asin((iDbl) / rayonDbl)) * 2;
            if (posX + i < pnlJeu.getMonDecor().getTerrain().length) {
                for (int j = 0; j < (int) rayonYDbl; j++) {
                    pnlJeu.getMonDecor().getTerrain()[posX + i][Math.min(posY + j, pnlJeu.getMonDecor().getTerrain()[posX + i].length - 1)] = false;
                    pnlJeu.getMonDecor().getTerrain()[posX + i][Math.max(posY - j, 0)] = false;
                }
                if (posX - i >= 0) {
                    for (int j = 0; j < (int) rayonYDbl; j++) {
                        pnlJeu.getMonDecor().getTerrain()[posX - i][Math.min(posY + j, pnlJeu.getMonDecor().getTerrain()[posX + i].length - 1)] = false;
                        pnlJeu.getMonDecor().getTerrain()[posX - i][Math.max(posY - j, 0)] = false;
                    }
                }
            }
        }
    }

}
